日志解析规则配置
最后于 更新
在全量日志中,您可以通过添加日志库将满足特定条件的日志写入不同日志库中,同时通过配置日志解析规则,将特定格式的日志进行结构化并加快查询速度。本文档将指导如何配置日志解析规则。
1 确定应用日志格式
以Java日志格式为参考:
2024-10-17 12:03:18.971 [http-nio-12346-exec-17] INFO travel.service.TravelServiceImpl - [getRestTicketNumber][Get Rest tickets num][num is: Response(status=1, msg=Get Left Ticket of Internal Success, data=1073741823)]
2 根据日志格式编写解析规则
在APO日志解析规则配置中,正则表达式的捕获组名会被提取出为日志字段列。下面给出匹配上述日志格式的解析规则示例:
.msg, err = parse_regex(.content, r'(?P<ts>.*?) \[(?P<thread>.*?)\] (?P<level>.*?) (?P<method>.*?) - (?P<msg>.*)')
if err == null {
.content = encode_json(.msg)
}
del(.msg)
其中,parse_regex
部分为正则表达式:
(?P<ts>.*?) \[(?P<thread>.*?)\] (?P<level>.*?) (?P<method>.*?) - (?P<msg>.*)
上述正则表达式通过命名捕获组语法将日志内容转换为 ts
thread
level
method
msg
等结构化标签。命名捕获组的标签名会在展示在“日志字段”中,对应 ClickHouse 日志库中的单独列,用于加快查询速度。
注意:
ts
和msg
是两个特殊的标签,不会处理为列,请仅将"日志时间"和"日志消息"命名为ts
和msg
如何根据需求修改表达式
假设需要提取出示例日志内容中 -
符号后面的 [getRestTicketNumber]
作为调用方法标签,可以在正则中添加\[?(P<caller>).*?\]
,结果如下:
(?P<ts>.*?) \[(?P<thread>.*?)\] (?P<level>.*?) (?P<method>.*?) - \[?(P<caller>).*?\](?P<msg>.*)
完成配置规则后,捕获组格式\[?(P<caller>).*?\]
会提取出日志字段列 caller
,加快过滤查询速度。最终日志中就会出现结构化标签"caller":"getRestTicketNumber"
。
扩展说明:捕获组表达式
在正则表达式中,
(?P<name>...)
是一种用于"命名捕获组"的语法。括号中的name
是捕获组的名称,这样可以通过名称而不是位置来引用捕获的内容。APO 使用命名捕获组作为日志解析规则的一部分。
3 检验规则是否正确
请在 VRL Playgroud 中输入日志解析规则,然后按照图示中流程对规则正确性进行验证。